﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace USMCdotNET
{
    /// <summary>
    /// Представляет собой элементарный участок маршрута
    /// </summary>
    public interface IPathElement
    {
        /// <summary>
        /// Запускает движение устройтсва по заданному участку маршрута
        /// </summary>
        /// <returns>Возвращает true, если перемещение успешно завершено. Если возникли какие-либо неполадки, возвращает false</returns>
        void Move();
        /// <summary>
        /// Показывает, выполняется ли в данный момент движение по этому маршруту
        /// </summary>
        bool AtProcess { get; }
        /// <summary>
        /// Показывает, пройден ли уже данный участок маршрута
        /// </summary>
        bool Accomplished { get; }
    }
    /// <summary>
    /// Участок маршрута со сложной функцией ускорения
    /// </summary>
    public interface IComlexlineElement:ILineElement
    {
        /// <summary>
        /// Функция ускорения
        /// </summary>
        IAcceleration Acceleration { get; set; }
        /// <summary>
        /// Начальный вектор скорости
        /// </summary>
        Vector<int> StartSpeed { get; set; }
        /// <summary>
        /// Длина участка (в шагах)
        /// </summary>
        int Length { get; set; }
        /// <summary>
        /// Время в миллисекундах, необходимое для преодоления маршрута
        /// </summary>
        int Time { get; set; }
        //последние два параметра взаимосвязаны друг с другом - очевидно)
    }
    /// <summary>
    /// Ускорение
    /// </summary>
    public interface IAcceleration
    {
        /// <summary>
        /// Показывает, задано ли ускорение функцией
        /// </summary>
        bool IsComplex { get; }
        /// <summary>
        /// Функция ускорения
        /// </summary>
        Func<int, Vector<int>> AccelerationFunction { get; set; }
        /// <summary>
        /// Скаляр ускорения(вектор направлен по направлению скорости)
        /// </summary>
        float LinearConstantAcceleration { get; set; }
    }
    /// <summary>
    /// Элементарная линия
    /// </summary>
    public interface ILineElement : IPathElement
    {
        /// <summary>
        /// скорость
        /// </summary>
        float Velocity { get; set; }
        /// <summary>
        /// Точка назначения
        /// </summary>
        Vector<int> Destination { get; set; }
    }
    /// <summary>
    /// коллекция элементов
    /// </summary>
    
    public interface IPauseElement : IPathElement
    {
        /// <summary>
        /// Время паузы в миллисекундах
        /// </summary>
        int Time { get; set; }
    }
    /// <summary>
    /// Элемент, прдставлющий из себя конечный/бесконечный цикл повторения элементов
    /// </summary>
    public interface ILoopElement : IPathElement
    {
        /// <summary>
        /// Количество итераций цикла
        /// </summary>
        Quantity IterationsNumber { get; set; }
        /// <summary>
        /// Определяет, должно ли устройство возвращаться к началу маршрута после полного прохода
        /// </summary>
        bool ReturnToStart { get; set; }
    }
}
